<?php

namespace Liuhelong\LaravelAdmin\Wechat\Services;
/***
** easywechat 外层封装，用于将微信返回错误作错误抛出处理
** 注意如果微信相关方法放在队列中执行，服务提供者中不要作为单例绑定（防止token过期）
** 使用方法 app('wechat_service')->service(公众号|小程序 可选)->handle(对象类型，方法，参数[])
***/
class Wechat{
	
	private $wechat = false;
	
	//可通过service提供其他服务
	public function service($type = 'wechat.official_account'){
		$this->wechat = app($type);
		return $this;
	}
	
	public function handle($object,$function,$parameter=[]){
		if(!$this->wechat){
			$this->service();
		}
		
		$result = $this->wechat->$object->$function(...$parameter);
		
		if(is_array($result) && !empty($result['errcode'])){
			throw new \Exception('wechat api error: errcode - '.$result['errcode'].' errmsg - '.$result['errmsg']);
		}
		return $result;
	}
	
	public function fluent_handle($object,array $parameters = []){
		if(!$this->wechat){
			$this->service();
		}
		
		$result = $this->wechat->$object;
		foreach($parameters as $parameter){
		    $function = $parameter[0];
		    $result = $result->$function(...($parameter[1]??[]));
		}
		
		if(is_array($result) && !empty($result['errcode'])){
			throw new \Exception('wechat api error: errcode - '.$result['errcode'].' errmsg - '.$result['errmsg']);
		}
		return $result;
	}
}